package com.future;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;

/**
 * @author xudong
 */
public class CompletableFutureDemo4 {

	// 定义线程池
	static ExecutorService threadPool = Executors.newFixedThreadPool(15);

	public static void main(String[] args) {
		// 10个订单号
		List<String> orderCodeList = Arrays.asList("order_01", "order_02", "order_03", "order_04",
				"order_05", "order_06", "order_07", "order_08", "order_09", "order_10");

		List<String> collect = orderCodeList.stream().map(CompletableFutureDemo4::convert).collect(Collectors.toList());

		// 打印结果
		collect.forEach(System.out::println);
	}

	/**
	 * 三个异步任务串行执行
	 * 要查找10个订单信息以及关联的商品、图片信息
	 * <p>
	 * 订单上有商品ID，通过商品ID可以查询到商品详细信息，图片信息存储在商品详细信息中。
	 * <p>
	 * 那就需要 查询完订单 再查询商品 最后查询图片信息，这3个异步任务需要串行执行。
	 */
	public static String convert(String order) {
		return CompletableFuture.supplyAsync(() -> String.format("订单：%s，关联商品ID为：%s", order, ThreadLocalRandom.current().nextInt()), threadPool)
				.thenApplyAsync((v) -> String.format(v + ",关联图片ID为：%s", ThreadLocalRandom.current().nextInt()), threadPool)
				.thenApplyAsync((v) -> String.format(v + ",关联图信息获取成功"), threadPool)
				.exceptionally(e -> {
					e.printStackTrace();
					return null;
				})
				.join();
	}
}
